;int cargar_tabla_codigo_desde_buffer ( unsigned char * buf,unsigned int size, codigo_t **tabla_codigo )

extern calloc

global cargar_tabla_codigo_desde_buffer

%define buf ebp+8						;*
%define size ebp+12					
%define tabla_codigo ebp+16 ;** !
%define ptr_tabla_codigo ebp-4 ;*
%define tabla_actual ebp-8 ;*
%define tabla_size 256
%define codigo_t_size 16
%define sizeof_header 16
%define codificacion_t_codigo 1
%define codificacion_t_long_codigo 5
%define codificacion_t_size 9


%define NULL 0
section .text

cargar_tabla_codigo_desde_buffer:
	convencion_C 8

	;pido memoria para la tabla de codigos
	push codigo_t_size
	push tabla_size
	call calloc
	add esp,8
	mov [ptr_tabla_codigo], eax

	cmp eax, NULL
	je error_mem

;!!
	mov ebx,[tabla_codigo]
	mov [ebx], eax

	mov ecx, [size] ;contador

	;avanzo hasta donde estan los codigos
;!!
	add dword [buf], sizeof_header
	
	crear_tabla:
		mov eax,[buf]
		xor ebx ,ebx
		mov bl, byte [eax] ;simbolo
		mov edx, [eax + codificacion_t_codigo]
		mov esi, [eax + codificacion_t_long_codigo]

		mov eax, [ptr_tabla_codigo]
		mov edi, ebx
		shl edi,4 ;multiplico opr 16 == ebx*codigo_t_size
		add eax, edi
		mov [tabla_actual],eax
		mov [eax], edx   ;guardo codigo

		;saco el reverso
		;uso rep para no gastar registros en un loop
		xor edi,edi ;aca guardo el reverso
		xor ebx,ebx ;contador2
		
		
		ciclo_reverso:
			shl edi,1
			mov eax,edx ;muevo el codigo sin reverso
			and eax, 1  ;hago modulo 2
			add edi, eax ;se lo sumo al reverso
			shr edx,1
			inc ebx
			cmp ebx, esi ;long_cod
			jne ciclo_reverso
		
		
		mov eax, [tabla_actual]
		mov [eax+4], edi ;codigo reverso
		mov [eax+8], ebx ;longitud codigo
		mov dword [eax+12], 1 ;valido

		add dword [buf],codificacion_t_size
		
	loop crear_tabla
	
	mov eax, 1
fin_ctcdb:
	convencion_C_fin 8
	ret

error_mem:
	print_error "No se pudo reservar memoria!"
	jmp fin_ctcdb
